AWS文件:Lambda Function Handler in Java
今天先提一下AWS文件的這部分,對於若要進行Lambda處理其他服務事件會有幫助,同時也為後面處理request/response我所選擇的作法鋪墊。
AWS提供兩種handler interface,也分別對應不同的I/O型態種類
而當Lambda中指定的Handler,也就是template.yaml當中Handler property若僅指定為package class時,預設的即是interface 當中定義的handleRequest method。但實際上可以設定任何符合參數的公開方法,且一個Class可以存在多個Handler method、多個Lambda設定同樣的Handler都是允許的。(所以我就習慣將同樣資源的CRUD或同類功能模組的Handler都放在同一個Class)
對於Handler method 多載解析規則描述AWS文件當中也有提及
處理常式多載解析
如果 Java 程式碼中有多個方法的名稱與 handler 名稱相同,則 AWS Lambda 將使用下列規則來挑選要叫用的方法:
選取具最多參數數目的方法。
如果有兩個以上的方法具有相同參數數量,AWS Lambda 即會選取將 Context 當做最後一個參數的方法。
如果這些參數中沒有或全部具有 Context 參數,便不會定義該行為。
但僅是告訴你是否能成功指定Handler的必要條件,因為這並非一般的method 多載,並沒有依arguments type判斷的能力。舉例來說,從Create a new AWS Lambda function建立S3 Event、Dynamodb Event的sample code會看到Input提供S3Event、DynamodbEvent兩種arguments,但其實都同樣是幫你準備好的POJO type,你高興用自己定義的POJO去接,或是用S3Event的handler接DynamodbEvent都是會照樣進行invoke,只是取不到想要的內容而已。
這個我現在不知道要寫什麼,因為Lambda能處理的服務來源是開放式的,甚至Lambda可以呼叫另一個Lambda(並非Java自己呼叫自己專案中的method喔)。目前我還沒有特別用到過...
不過覺得自己很喜歡以String方法處理input的話,可以試試看就是了(笑
實作篇章將使用POJO方法,要注意的是,雖然AWS使用Jackson來實作POJO的部分,但是並不支援annotation這種標註語法 。不過這並非代表我們在request/response針對body(payload)的部分不能使用喔,之後會有詳細的說明。
Low-level處理手段,當前面的方式都無法或不適合處理時,就使用這個型別吧。
接下來是針對API Gateway request/response的我流設計方式,但並非只能或這種方式比較好,而是個人目前使用的方式而已。畢竟Java不是我目前工作上的主要語言,不少寫法都是這個月來撰寫測試拼湊出來的,但自覺應該還是嘗試了各種想法,希望能提供有用的意見囉。